package ui.newgamescreen;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.io.File;
import java.io.IOException;
import java.text.NumberFormat;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.BoundedRangeModel;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.text.NumberFormatter;

import ui.ImagePanel;

public class UniverseOptionPanel extends ImagePanel {

	/* Панели */
	private final JPanel upPanel = new JPanel();
	private final JPanel downPanel = new JPanel();
	private final ImagePanel previewPanel = new ImagePanel();
	private final JPanel universeFormPanel = new JPanel();
	private final JPanel firstUniverseFormPanel = new JPanel();
	private final JPanel secondUniverseFormPanel = new JPanel();
	private final JPanel thirdUniverseFormPanel = new JPanel();
	private final JPanel forthUniverseFormPanel = new JPanel();

	// Модели данных компонентов
	private String[] elements = new String[] {"Случайная", "Кластерная", "Спиральная"};
	private SpinnerModel sModel = new SpinnerNumberModel(2, 2, 16, 1);
	private NumberFormat numberFormat = NumberFormat.getNumberInstance();
	private NumberFormatter formatter;

	/* Компоненты панели описания галактики */
	public final JComboBox universeFormChooser = new JComboBox(elements);
	public JTextField universeSizeField = null;
	public final NumberSpinner clusterQuantityChooser = new NumberSpinner(sModel);
	public JTextField starQuantityField = null;
	private JLabel universeFormLabel = new JLabel("Форма вселенной");
	private JLabel clusterQuantityLabel = new JLabel("Количество кластеров");
	private JLabel starQuantityLabel = new JLabel("Количество звезд");
	private JLabel univereSizeLabel = new JLabel("Размер вселенной");

	public UniverseOptionPanel() {
		setOpaque(true);
		setVisible(true);
		setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));

		/*
		 * Конструируем невидимые панели для расположения компонентов в центре
		 * экрана
		 */

		upPanel.setOpaque(true);
		upPanel.setVisible(true);
		upPanel.setBackground(new Color(30, 144, 255));
		downPanel.setOpaque(true);
		downPanel.setVisible(true);
		downPanel.setBackground(new Color(3, 14, 225));

		/* Разбиваем главную панель на верхнюю и нижнюю */
		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		add(upPanel);
		add(Box.createVerticalGlue());
		add(downPanel);

		upPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));

		previewPanel.setOpaque(true);
		previewPanel.setVisible(true);
		previewPanel.setPreferredSize(new Dimension(300, 300));

		universeFormPanel.setOpaque(true);
		universeFormPanel.setVisible(true);
		universeFormPanel.setBackground(new Color(225, 140, 25));

		/* Разбиваем верхнюю панель на левую и правую часть */
		upPanel.setLayout(new BoxLayout(upPanel, BoxLayout.X_AXIS));
		upPanel.add(previewPanel);
		upPanel.add(Box.createHorizontalGlue());
		upPanel.add(universeFormPanel);

		try {
			previewPanel.setImage(ImageIO.read(new File("image/bgd.jpg")));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		/* Расстановка компонентов на панели свойств галактики */

		firstUniverseFormPanel.setOpaque(true);
		firstUniverseFormPanel.setVisible(true);
		firstUniverseFormPanel.setBackground(new Color(225, 14, 225));

		secondUniverseFormPanel.setOpaque(true);
		secondUniverseFormPanel.setVisible(true);
		secondUniverseFormPanel.setBackground(new Color(225, 14, 225));

		thirdUniverseFormPanel.setOpaque(true);
		thirdUniverseFormPanel.setVisible(true);
		thirdUniverseFormPanel.setBackground(new Color(225, 14, 225));

		forthUniverseFormPanel.setOpaque(true);
		forthUniverseFormPanel.setVisible(true);
		forthUniverseFormPanel.setBackground(new Color(144, 144, 25));

		universeFormPanel.setLayout(new BoxLayout(universeFormPanel, BoxLayout.Y_AXIS));
		universeFormPanel.add(firstUniverseFormPanel);
		universeFormPanel.add(Box.createVerticalGlue());
		universeFormPanel.add(secondUniverseFormPanel);
		universeFormPanel.add(Box.createVerticalGlue());
		universeFormPanel.add(thirdUniverseFormPanel);
		universeFormPanel.add(Box.createVerticalGlue());
		universeFormPanel.add(forthUniverseFormPanel);

		/* Первая строка панели опций формы вселенной */

		firstUniverseFormPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
		firstUniverseFormPanel.setLayout(new BoxLayout(firstUniverseFormPanel, BoxLayout.X_AXIS));

		/* Добавляем выпадающий список формы галактики */
		universeFormChooser.setPrototypeDisplayValue("Длинный элемент");
		universeFormChooser.setMaximumSize(new Dimension(100, 20));
		universeFormChooser.setToolTipText("Выберите форму вселенной");
		firstUniverseFormPanel.add(universeFormLabel);
		firstUniverseFormPanel.add(Box.createHorizontalGlue());
		firstUniverseFormPanel.add(universeFormChooser);

		/* Вторая строка панели опций формы вселенной */

		secondUniverseFormPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
		secondUniverseFormPanel.setLayout(new BoxLayout(secondUniverseFormPanel, BoxLayout.X_AXIS));

		/* Добавляем счетчик ввода количества кластеров */
		clusterQuantityChooser.setEnabled(false);
		clusterQuantityChooser.setMaximumSize(new Dimension(100, 20));
		clusterQuantityChooser.setToolTipText("Выберите количество кластеров: от 2 до 16");

		clusterQuantityChooser.setEditor(new JSpinner.NumberEditor(clusterQuantityChooser, "##"));
		secondUniverseFormPanel.add(clusterQuantityLabel);
		secondUniverseFormPanel.add(Box.createHorizontalGlue());
		secondUniverseFormPanel.add(clusterQuantityChooser);

		/* Добавим управление форматом полей */
		numberFormat.setMaximumIntegerDigits(4);
		numberFormat.setMinimumIntegerDigits(1);
		numberFormat.setParseIntegerOnly(true);
		formatter = new NumberFormatter(numberFormat);

		/* Третья строка панели опций формы вселенной */

		thirdUniverseFormPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
		thirdUniverseFormPanel.setLayout(new BoxLayout(thirdUniverseFormPanel, BoxLayout.X_AXIS));

		/* Добавляем поле ввода количества звезд */
		starQuantityField = new JFormattedTextField(formatter);
		starQuantityField.setMaximumSize(new Dimension(100, 20));
		starQuantityField.setColumns(5);
		starQuantityField.setText("10");
		starQuantityField.setToolTipText("Выберите количество звезд: от 10 до 1000");

		thirdUniverseFormPanel.add(starQuantityLabel);
		thirdUniverseFormPanel.add(Box.createHorizontalGlue());
		thirdUniverseFormPanel.add(starQuantityField);

		/* Четвертая строка панели опций формы вселенной */

		forthUniverseFormPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
		forthUniverseFormPanel.setLayout(new BoxLayout(forthUniverseFormPanel, BoxLayout.X_AXIS));

		/* Добавляем поле ввода количества звезд */
		universeSizeField = new JFormattedTextField(formatter);
		universeSizeField.setMaximumSize(new Dimension(100, 20));
		universeSizeField.setColumns(5);
		universeSizeField.setText("20");
		universeSizeField
			.setToolTipText("Выберите размер вселенной(диаметр): от 20 до 1000 световых лет");

		forthUniverseFormPanel.add(univereSizeLabel);
		forthUniverseFormPanel.add(Box.createHorizontalGlue());
		forthUniverseFormPanel.add(universeSizeField);

	}

}
